iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
自我挑戰組

轉職未滿一年的點點滴滴系列 第 16

[Day 16] -『 GO語言學習筆記』- 核心型別(III)

  • 分享至 

  • xImage
  •  

以下筆記摘錄自『 The Go Workshop 』。

字串(String)

Golang只有一種文字型別 - String(字串)。分成以下兩種表示法:

一、 原始的(raw):一對反引號 『 `` 』 的字串
二、 轉譯的(interpreted):一對雙引號 『 "" 』 的字串

如果想顯示的文字裡面含有很多的雙引號字元、反斜線字元等等,這樣會比較推薦使用原始字串,原因如下方範例。

For example,

package main

import "fmt"

func main() {
    
    Example1 := `Please refer to this "https://ithelp.ithome.com.tw/"`
    Example2 := `Please refer to this \"https://ithelp.ithome.com.tw/\"`

	fmt.Println(Example1)
	fmt.Println(Example2)
}
//Outout
Please refer to this "https://ithelp.ithome.com.tw/"
Please refer to this "https://ithelp.ithome.com.tw/"

Rune

符文(rune)是一種可以儲存單一一個UFT-8字元的型別(Unicode的編碼,會佔用1~4個位元組)。在Golang中,字串通常都會用UFT-8編碼。但以字串這個型別來說,他能儲存的文字有也有可能不是UFT-8編碼,所以在處理字串時,我們會需要額外的檢查。

當文字以string儲存時,Golang會以位元(byte)去儲存所有的字串,也就是說有些UFT-8字元可能會被拆開成多個位元組。

不論其編碼方式是採用單一還是多重位元組,最好是把字串從byte集合轉換成rune集合。

package main

import "fmt"

func main() {
	username := "Ako sa máš"

	for i := 0; i < len(username); i++ {
		fmt.Print(username[i], " ")
	}
}
//Output
65 107 111 32 115 97 32 109 195 161 197 161

再將位元數值轉換成字串看看會發生什麼事。

package main

import "fmt"

func main() {
	username := "Ako sa máš"

	for i := 0; i < len(username); i++ {
		fmt.Print(string(username[i]), " ")
	}
}
///Output
A k o s a m ? ?

為了能夠安全的處理多位元組編碼字串,建議先把byte型別的字串換成rune型別的切片

package main

import "fmt"

func main() {
	username := "Ako sa máš"
    rune := [] rune(username)
    
	for i := 0; i < len(username); i++ {
		fmt.Print(string(username[i]), " ")
	}
}
///Output
A k o s a m á š

上一篇
[Day 15] -『 GO語言學習筆記』- 核心型別(II)
下一篇
[Day 17] - 『轉職工作的Lessons learned』 - Cube.js / Redis TimeoutError
系列文
轉職未滿一年的點點滴滴30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言